package com.wyl.dtoAndVoTypeByGeneric;

/**
 * @author 吴宇亮 on 2023/4/6 9:32
 */
public interface Father4<P extends Number> {

    <T extends Number> Res<T> hello1(T param);

    <T1 extends Number> Res<T1> hello2 (P param);

    <T1 extends Number> Res<T1> hello3 (P param);

}

class Son4 implements Father4<NumDouble> {

    // 使用泛型后，返回值要跟父类一致，如果要实现方法返回父类的其中一个子类，就要这么写
    // 入参无论如何都是要跟接口一致的，如果想要入参为某个类型的子类，只能这么定义
    @Override
    public Res<NumberInt> hello1(Number param) {
        return null;
    }

    // 因为该类的泛型是<NumDouble>，所以入参只能是NumDouble，但是返回值可以是Number的子类
    @Override
    public Res<NumDouble> hello2(NumDouble param) {
        return null;
    }

    // 因为该类的泛型是<NumDouble>，所以入参只能是NumDouble，但是返回值可以是Number的子类
    @Override
    public Res<NumberInt> hello3(NumDouble param) {
        return null;
    }
}
